org 100h                        ; 程序加载到100h，可用于生成COM
; 设置时钟中断向量（08h），初始化段寄存器
    xor ax,ax                       ; AX = 0
    mov es,ax                   ; ES = 0

    ; clear screen
    mov ah, 06h     ; 功能号(向上滚动文本显示屏幕)
    mov al, 0
    mov ch, 0
    mov cl, 0
    mov dh, 24
    mov dl, 79
    mov bh, 0ch
    int 10h ; call 10H to print interrupt

    mov word[es:20h],Timer      ; 设置时钟中断向量（8#）的偏移地址
    mov ax,cs 
    mov [es:22h],ax             ; 设置时钟中断向量的段地址=CS
    mov ds,ax                   ; DS = CS
    mov es,ax                   ; ES = CS   
    mov ax,0B800h               ; 文本窗口显存的段地址
    mov gs,ax                   ; GS = B800h
    mov ah,0Ch                  ; 0000：黑底、1010：亮绿字（默认值为07h）
    mov al,'C'                      ; AL = 显示字符值（默认值为20h=空格符）
    mov byte[odd],0
    mov [gs:((80*12+39)*2)],ax       ; 屏幕第 0 行, 第 39 列
    jmp $                       ; 死循环
; 时钟中断处理程序
    delay equ 18                 ; 计时器延迟计数 18=1second
    count db delay                  ; 计时器计数变量，初值=delay 
    odd   db 0
Timer: ; 时钟中断处理例程入口
    dec byte[count]             ; 递减计数变量
    jnz end                     ; >0：跳转
    cmp byte[odd],0         ; odd==1?
    je Char_X                   ; ==1跳转
    cmp byte[odd],1
    je Char_F
Char_C: ; odd == 0, 选择字符C
    mov byte[odd],0         ; Odd=0，下次选择X
    mov ah,0Ch                  ; 0000：黑底、1100：亮红字（默认值为07h）
    mov al,'C'              ; 选择字符O
    jmp ShowChar            ; 跳转到显示
Char_X: ; odd == 1, 选择字符X
    mov byte[odd],1         ; Odd=1，下次选择F
    mov ah,0Ah                  ; 0000：黑底、1010：亮绿字（默认值为07h）
    mov al,'X'              ; 选择字符S
    jmp ShowChar
Char_F: ; odd == 1, 选择字符X
    mov byte[odd],2         ; Odd=2，下次选择C
    mov ah, 9h                  ; 0000：黑底、1001：亮蓝字（默认值为07h）
    mov al,'F'              ; 选择字符S

ShowChar: ; 显示字符
    mov [gs:((80*12+39)*2)],ax ; 显示当前字符
    mov byte[count],delay           ; 重置计数变量=初值delay
end:
    mov al,20h                  ; AL = EOI
    out 20h,al                      ; 发送EOI到主8529A
    out 0A0h,al                 ; 发送EOI到从8529A
    iret                            ; 从中断返回